日本の新型コロナウィルスに関する情報が抱える大きな問題は、ソースごとに値が微妙にことなっていることです。原因は明白で、総元締めであるはずの厚生労働省が各自治からの患者データを集計せずに各自治体のプレスリリースやウェブサイトの数値を積上げたものを発表していることにあります。
本来であれば医療機関->市町村->都道府県->厚生労働省の順で患者のデータを全て吸い上げて集計すべきなのです。

厚生労働省データ

厚生労働省のオープンデータのページで公開しているデータは、あくまでも、「国内事例」のみであり、チャーター便、空港検疫、外国船籍の客船を除くデータになっている。なお、データによっては途中からデータソースが変更されているものがある。

 

Import

項目ごとのCSVファイルになっているため、個々に読み込む。

 

陽性確定者数

「陽性者数」のデータ。ここでは、全て陽性確定者と表記する。厚生労働省が公開している陽性確定者数のデータは単日のデータのみ。

"https://www.mhlw.go.jp/content/pcr_positive_daily.csv" %>% 
  readr::read_csv()

 

死亡者数

死亡者数のデータは、なぜか累計データだけが公開されている。

"https://www.mhlw.go.jp/content/death_total.csv" %>% 
  readr::read_csv()

 

入院治療等を要する者の数

いわゆる無症状患者などの軽症患者を除く陽性確定者の数。各報告日時点の集計値となっている。

"https://www.mhlw.go.jp/content/cases_total.csv" %>% 
  readr::read_csv()

 

Wrangring (tidy and transform)

各データを扱いやすいように変換する。

陽性確定者数

単日のデータなので累計データを求める。なお、記録漏れがあっても対処できるように日付の補完を行う。

df_mhlw <- "https://www.mhlw.go.jp/content/pcr_positive_daily.csv" %>% 
  readr::read_csv() %>% 
  dplyr::mutate(date = lubridate::as_date(`日付`)) %>% 
  tidyr::complete(date = seq.Date(from = min(date), to = max(date), by = "day")) %>% 
  dplyr::mutate(n = as.integer(`PCR 検査陽性者数(単日)`),
                cum = cumsum(n)) %>% 
  dplyr::select(date, n, cum)

df_mhlw

 

死亡者数

陽性確定者数とは逆に短日の数値を求める。

dead_mhlw <- "https://www.mhlw.go.jp/content/death_total.csv" %>% 
  readr::read_csv() %>% 
  dplyr::mutate(date = lubridate::as_date(`日付`)) %>% 
  tidyr::complete(date = seq.Date(from = min(date), to = max(date), by = "day")) %>% 
  dplyr::mutate(cum_dead = as.integer(`死亡者数`),
                dead = cum_dead - dplyr::lag(cum_dead, default = 0)) %>% 
  dplyr::select(date, dead, cum_dead)

dead_mhlw

入院治療等を要する者の数

各報告日時点の集計値。

patient_mhlw <- "https://www.mhlw.go.jp/content/cases_total.csv" %>% 
  readr::read_csv() %>% 
  dplyr::mutate(date = lubridate::as_date(`日付`)) %>% 
  tidyr::complete(date = seq.Date(from = min(date), to = max(date), by = "day")) %>% 
  dplyr::mutate(patient = as.integer(`入院治療を要する者`)) %>% 
  dplyr::select(date, patient)
patient_mhlw

 

結合

上記のデータフレームをひとつにまとめる。

x_mhlw <- df_mhlw %>% 
  dplyr::left_join(dead_mhlw, by = c("date")) %>% 
  dplyr::left_join(patient_mhlw, by = c("date")) %>% 
  tidyr::replace_na(list(dead = 0L, cum_dead = 0L, patient = 0L)) %>% 
  dplyr::mutate(diff = n - dplyr::lag(n, default = 0L),
                diff_dead = dead - dplyr::lag(dead, default = 0L),
                diff_patient = patient - dplyr::lag(patient, default = 0L)) %>% 
  dplyr::select(date, n, diff, cum, patient, diff_patient, dead, diff_dead, cum_dead)
x_mhlw

 

Covid19 Japan

Covid19 Japanが独自に収集している陽性確定者単位のデータ。ソースとデータは全てGitHubにて公開されているが、データはJSON形式である点に注意。厚生労働省のデータと異なり、チャーター便、空港検疫、外国船籍の客船が含まれている点に注意。
なお、発表後に修正されたレコード(インスタンス)は削除されれずにステータスなどが変更されているので「レコード数 \(\neq\) 累計陽性確定者」である。

 

Import

JSON形式のデータを読み込むにはjsonliteパッケージを用いる。

path <- "https://raw.githubusercontent.com/reustle/covid19japan-data/master/docs/patient_data/"

df <- path %>% 
  paste0("latest.json") %>% 
  readr::read_lines() %>% 
  paste0(path, .) %>% 
  jsonlite::fromJSON()
df

Wrangring (tidy and transform)

まう、データを把握するためにskimrパッケージを用いて要約する。

df %>% 
  skimr::skim()

ほとんどが文字列データなので、適宜、項目を変換すると共に使いそうもない項目を削除しておく。

df %>% 
  dplyr::mutate(date = lubridate::as_date(dateAnnounced),
                ageBracket = forcats::as_factor(ageBracket),
                gender = forcats::as_factor(gender),
                patientStatus = forcats::as_factor(patientStatus),
                cluster = dplyr::if_else(!is.na(knownCluster), TRUE, FALSE)) %>% 
  dplyr::select(patientId, date, ageBracket, gender, detectedPrefecture,
                patientStatus, knownCluster, cluster, confirmedPatient,
                charterFlightPassenger, cruisePassengerDisembarked) %>% 
  dplyr::filter(confirmedPatient == TRUE)
df %>% 
  dplyr::group_by(patientId) %>% 
  dplyr::summarise(n = n())

df %>% 
  dplyr::filter(patientId == "-1")

df %>% 
  dplyr::filter(patientStatus == "Deceased")

JAG Japan

ジャッグジャパン株式会社が独自に収集している陽性確定者単位のデータ。データはCSV形式にて公開されているが、GIS処理用のデータが含まれている点に注意。「レコード数 \(=\) 累計陽性確定者数」になっている。

Import

GIS処理用のデータは不要なのでWrangringの前に除いておきます。

df_jag <- "https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv" %>% 
  readr::read_csv() %>% 
  dplyr::select(1:20)
## Warning: Missing column names filled in: 'X52' [52], 'X53' [53], 'X54' [54]
## Warning: 610 parsing failures.
##   row              col expected              actual                                                               file
##  4484 市町村内症例番号 a double 神戸59/西宮36       'https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv'
##  4485 市町村内症例番号 a double 神戸60/西宮37       'https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv'
##  6054 市町村内症例番号 a double 川口40/さいたま50   'https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv'
## 12486 市町村内症例番号 a double 神戸237/西宮63      'https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv'
## 14454 市町村内症例番号 a double (271)のちに番号なし 'https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv'
## ..... ................ ........ ................... ..................................................................
## See problems(...) for more details.
df_jag
df_jag %>% 
  dplyr::mutate(date = lubridate::mdy(`確定日`))

Wrangring (tidy and transform)

 

Area Data

都道府県と地方区分に関するデータをGistで公開していますので、使いたい方はご自由に。

 

Data Wrangling